# -*- coding: utf-8 -*-
# frontend/pages/05_👥_用户管理.py
import streamlit as st
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from datetime import datetime, timedelta
import random

st.set_page_config(
    page_title="👥 用户管理",
    page_icon="👥",
    layout="wide"
)

def generate_user_data():
    """生成模拟用户数据"""
    users = []
    for i in range(50):
        users.append({
            'id': f'user_{i+1:03d}',
            'username': f'用户{i+1}',
            'email': f'user{i+1}@example.com',
            'role': random.choice(['普通用户', '高级用户', 'VIP用户', '管理员']),
            'status': random.choice(['活跃', '非活跃', '已禁用']),
            'register_date': datetime.now() - timedelta(days=random.randint(1, 365)),
            'last_login': datetime.now() - timedelta(days=random.randint(0, 30)),
            'message_count': random.randint(0, 1000),
            'total_tokens': random.randint(1000, 50000),
            'satisfaction_score': random.uniform(3.0, 5.0)
        })
    return users

def main():
    st.title("👥 用户管理中心")
    st.markdown("---")
    
    # 生成用户数据
    users_data = generate_user_data()
    df_users = pd.DataFrame(users_data)
    
    # 顶部统计卡片
    render_user_stats(df_users)
    
    # 主要功能区域
    tab1, tab2, tab3, tab4 = st.tabs(["📋 用户列表", "📊 用户分析", "🎯 用户画像", "⚙️ 权限管理"])
    
    with tab1:
        render_user_list(df_users)
    
    with tab2:
        render_user_analytics(df_users)
    
    with tab3:
        render_user_profile(df_users)
    
    with tab4:
        render_permission_management(df_users)

def render_user_stats(df_users):
    """渲染用户统计信息"""
    col1, col2, col3, col4, col5 = st.columns(5)
    
    with col1:
        total_users = len(df_users)
        st.metric("👥 总用户数", f"{total_users:,}")
    
    with col2:
        active_users = len(df_users[df_users['status'] == '活跃'])
        st.metric("🟢 活跃用户", f"{active_users:,}", 
                 delta=f"{active_users/total_users*100:.1f}%")
    
    with col3:
        vip_users = len(df_users[df_users['role'] == 'VIP用户'])
        st.metric("⭐ VIP用户", f"{vip_users:,}")
    
    with col4:
        avg_messages = df_users['message_count'].mean()
        st.metric("💬 平均消息数", f"{avg_messages:.0f}")
    
    with col5:
        avg_satisfaction = df_users['satisfaction_score'].mean()
        st.metric("😊 平均满意度", f"{avg_satisfaction:.1f}/5.0")

def render_user_list(df_users):
    """渲染用户列表"""
    st.subheader("📋 用户详细列表")
    
    # 搜索和筛选
    search_col1, search_col2, search_col3 = st.columns(3)
    
    with search_col1:
        search_term = st.text_input("🔍 搜索用户", placeholder="输入用户名或邮箱...")
    
    with search_col2:
        role_filter = st.selectbox("👤 用户角色", ['全部'] + list(df_users['role'].unique()))
    
    with search_col3:
        status_filter = st.selectbox("📊 用户状态", ['全部'] + list(df_users['status'].unique()))
    
    # 应用筛选
    filtered_df = df_users.copy()
    
    if search_term:
        filtered_df = filtered_df[
            filtered_df['username'].str.contains(search_term, na=False) |
            filtered_df['email'].str.contains(search_term, na=False)
        ]
    
    if role_filter != '全部':
        filtered_df = filtered_df[filtered_df['role'] == role_filter]
    
    if status_filter != '全部':
        filtered_df = filtered_df[filtered_df['status'] == status_filter]
    
    # 显示结果数量
    st.info(f"📊 找到 {len(filtered_df)} 个用户")
    
    # 用户表格
    if not filtered_df.empty:
        # 格式化数据显示
        display_df = filtered_df.copy()
        display_df['register_date'] = display_df['register_date'].dt.strftime('%Y-%m-%d')
        display_df['last_login'] = display_df['last_login'].dt.strftime('%Y-%m-%d')
        display_df['satisfaction_score'] = display_df['satisfaction_score'].round(2)
        
        # 添加操作列
        display_df['操作'] = '管理'
        
        st.dataframe(
            display_df[['username', 'email', 'role', 'status', 'register_date', 
                       'last_login', 'message_count', 'satisfaction_score']],
            use_container_width=True,
            column_config={
                'username': '用户名',
                'email': '邮箱',
                'role': '角色',
                'status': '状态',
                'register_date': '注册日期',
                'last_login': '最后登录',
                'message_count': '消息数量',
                'satisfaction_score': '满意度'
            }
        )
        
        # 批量操作
        st.markdown("#### 🔧 批量操作")
        
        batch_col1, batch_col2, batch_col3 = st.columns(3)
        
        with batch_col1:
            if st.button("📧 发送通知", use_container_width=True):
                st.success(f"✅ 已向 {len(filtered_df)} 个用户发送通知")
        
        with batch_col2:
            if st.button("📊 导出数据", use_container_width=True):
                csv = filtered_df.to_csv(index=False)
                st.download_button(
                    label="⬇️ 下载CSV文件",
                    data=csv,
                    file_name=f"users_{datetime.now().strftime('%Y%m%d')}.csv",
                    mime="text/csv"
                )
        
        with batch_col3:
            if st.button("🔄 刷新数据", use_container_width=True):
                st.rerun()
    else:
        st.warning("⚠️ 没有找到符合条件的用户")

def render_user_analytics(df_users):
    """渲染用户分析"""
    st.subheader("📊 用户行为分析")
    
    # 用户注册趋势
    col1, col2 = st.columns(2)
    
    with col1:
        st.markdown("#### 📈 用户注册趋势")
        
        # 按月统计注册用户
        df_users['register_month'] = df_users['register_date'].dt.to_period('M')
        monthly_registrations = df_users.groupby('register_month').size().reset_index(name='count')
        monthly_registrations['register_month'] = monthly_registrations['register_month'].astype(str)
        
        fig_registrations = px.line(
            monthly_registrations,
            x='register_month',
            y='count',
            markers=True,
            title="每月新用户注册数量"
        )
        
        fig_registrations.update_layout(
            xaxis_title="月份",
            yaxis_title="注册用户数",
            height=400
        )
        
        st.plotly_chart(fig_registrations, use_container_width=True)
    
    with col2:
        st.markdown("#### 👤 用户角色分布")
        
        role_counts = df_users['role'].value_counts()
        
        fig_roles = px.pie(
            values=role_counts.values,
            names=role_counts.index,
            title="用户角色分布",
            color_discrete_sequence=['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4']
        )
        
        fig_roles.update_traces(textposition='inside', textinfo='percent+label')
        fig_roles.update_layout(height=400)
        
        st.plotly_chart(fig_roles, use_container_width=True)
    
    # 用户活跃度分析
    col3, col4 = st.columns(2)
    
    with col3:
        st.markdown("#### 💬 消息数量分布")
        
        fig_messages = px.histogram(
            df_users,
            x='message_count',
            nbins=20,
            title="用户消息数量分布",
            color_discrete_sequence=['#FFD93D']
        )
        
        fig_messages.update_layout(
            xaxis_title="消息数量",
            yaxis_title="用户数量",
            height=400
        )
        
        st.plotly_chart(fig_messages, use_container_width=True)
    
    with col4:
        st.markdown("#### ⭐ 满意度分析")
        
        fig_satisfaction = px.box(
            df_users,
            x='role',
            y='satisfaction_score',
            title="各角色用户满意度分布",
            color='role'
        )
        
        fig_satisfaction.update_layout(
            xaxis_title="用户角色",
            yaxis_title="满意度评分",
            height=400
        )
        
        st.plotly_chart(fig_satisfaction, use_container_width=True)
    
    # 用户留存分析
    st.markdown("#### 📊 用户留存分析")
    
    # 模拟留存数据
    retention_data = {
        '时间段': ['第1天', '第7天', '第30天', '第90天', '第180天', '第365天'],
        '留存率': [100, 85, 65, 45, 35, 25],
        '用户数': [1000, 850, 650, 450, 350, 250]
    }
    
    df_retention = pd.DataFrame(retention_data)
    
    fig_retention = go.Figure()
    
    fig_retention.add_trace(go.Scatter(
        x=df_retention['时间段'],
        y=df_retention['留存率'],
        mode='lines+markers',
        name='留存率 (%)',
        line=dict(color='#FF6B6B', width=3),
        yaxis='y'
    ))
    
    fig_retention.add_trace(go.Bar(
        x=df_retention['时间段'],
        y=df_retention['用户数'],
        name='留存用户数',
        marker_color='#4ECDC4',
        yaxis='y2',
        opacity=0.7
    ))
    
    fig_retention.update_layout(
        title="用户留存趋势分析",
        xaxis_title="时间段",
        yaxis=dict(title="留存率 (%)", side="left"),
        yaxis2=dict(title="用户数量", side="right", overlaying="y"),
        height=400,
        hovermode='x unified'
    )
    
    st.plotly_chart(fig_retention, use_container_width=True)

def render_user_profile(df_users):
    """渲染用户画像"""
    st.subheader("🎯 用户画像分析")
    
    # 用户细分
    st.markdown("#### 👥 用户细分")
    
    segment_col1, segment_col2, segment_col3 = st.columns(3)
    
    with segment_col1:
        st.markdown("**🆕 新手用户**")
        newbie_users = df_users[df_users['message_count'] < 50]
        st.metric("数量", len(newbie_users))
        st.markdown("- 注册时间较短")
        st.markdown("- 消息数量少于50条")
        st.markdown("- 需要引导和帮助")
    
    with segment_col2:
        st.markdown("**🔥 活跃用户**")
        active_users = df_users[
            (df_users['message_count'] >= 50) & 
            (df_users['message_count'] < 500)
        ]
        st.metric("数量", len(active_users))
        st.markdown("- 定期使用系统")
        st.markdown("- 消息数量50-500条")
        st.markdown("- 是主要用户群体")
    
    with segment_col3:
        st.markdown("**⭐ 超级用户**")
        power_users = df_users[df_users['message_count'] >= 500]
        st.metric("数量", len(power_users))
        st.markdown("- 重度使用者")
        st.markdown("- 消息数量超过500条")
        st.markdown("- 具有推广价值")
    
    # 用户行为特征
    st.markdown("#### 📊 行为特征分析")
    
    behavior_tab1, behavior_tab2, behavior_tab3 = st.tabs(["使用频率", "偏好分析", "满意度"])
    
    with behavior_tab1:
        # 模拟使用频率数据
        frequency_data = {
            '使用频率': ['每天', '每周2-3次', '每周1次', '每月几次', '很少使用'],
            '用户数量': [180, 150, 100, 80, 40],
            '占比': [32.7, 27.3, 18.2, 14.5, 7.3]
        }
        
        df_frequency = pd.DataFrame(frequency_data)
        
        fig_frequency = px.bar(
            df_frequency,
            x='使用频率',
            y='用户数量',
            color='占比',
            color_continuous_scale='viridis',
            text='用户数量'
        )
        
        fig_frequency.update_traces(textposition='outside')
        fig_frequency.update_layout(height=400)
        
        st.plotly_chart(fig_frequency, use_container_width=True)
    
    with behavior_tab2:
        # 模拟偏好数据
        preference_data = {
            '功能偏好': ['智能问答', '代码生成', '文本创作', '数据分析', '图像处理'],
            '使用次数': [850, 720, 680, 450, 300]
        }
        
        df_preference = pd.DataFrame(preference_data)
        
        fig_preference = px.pie(
            df_preference,
            values='使用次数',
            names='功能偏好',
            title="用户功能偏好分布"
        )
        
        st.plotly_chart(fig_preference, use_container_width=True)
    
    with behavior_tab3:
        # 满意度分布
        satisfaction_ranges = ['5分 (非常满意)', '4-5分 (满意)', '3-4分 (一般)', '2-3分 (不满意)', '1-2分 (很不满意)']
        satisfaction_counts = [
            len(df_users[df_users['satisfaction_score'] >= 4.5]),
            len(df_users[(df_users['satisfaction_score'] >= 4.0) & (df_users['satisfaction_score'] < 4.5)]),
            len(df_users[(df_users['satisfaction_score'] >= 3.0) & (df_users['satisfaction_score'] < 4.0)]),
            len(df_users[(df_users['satisfaction_score'] >= 2.0) & (df_users['satisfaction_score'] < 3.0)]),
            len(df_users[df_users['satisfaction_score'] < 2.0])
        ]
        
        fig_satisfaction_dist = px.funnel(
            x=satisfaction_ranges,
            y=satisfaction_counts,
            title="用户满意度分布"
        )
        
        st.plotly_chart(fig_satisfaction_dist, use_container_width=True)

def render_permission_management(df_users):
    """渲染权限管理"""
    st.subheader("⚙️ 权限管理")
    
    # 角色权限配置
    st.markdown("#### 👑 角色权限配置")
    
    roles_permissions = {
        '普通用户': {
            'permissions': ['基础聊天', '查看历史', '导出对话'],
            'limits': {'daily_messages': 100, 'models': 2, 'storage': '1GB'},
            'color': '#95A5A6'
        },
        '高级用户': {
            'permissions': ['基础聊天', '查看历史', '导出对话', '高级模型', '批量处理'],
            'limits': {'daily_messages': 500, 'models': 5, 'storage': '10GB'},
            'color': '#3498DB'
        },
        'VIP用户': {
            'permissions': ['所有功能', 'API访问', '优先支持', '定制模型'],
            'limits': {'daily_messages': 2000, 'models': '无限制', 'storage': '100GB'},
            'color': '#F1C40F'
        },
        '管理员': {
            'permissions': ['系统管理', '用户管理', '数据管理', '所有功能'],
            'limits': {'daily_messages': '无限制', 'models': '无限制', 'storage': '无限制'},
            'color': '#E74C3C'
        }
    }
    
    permission_col1, permission_col2 = st.columns(2)
    
    with permission_col1:
        st.markdown("##### 🎯 角色权限矩阵")
        
        for role, config in roles_permissions.items():
            with st.expander(f"{role} ({len(df_users[df_users['role'] == role])} 人)"):
                st.markdown(f"**🔑 权限列表:**")
                for perm in config['permissions']:
                    st.markdown(f"- ✅ {perm}")
                
                st.markdown(f"**📊 使用限制:**")
                for limit_key, limit_value in config['limits'].items():
                    st.markdown(f"- {limit_key}: {limit_value}")
    
    with permission_col2:
        st.markdown("##### ⚙️ 权限调整")
        
        # 选择用户
        selected_user = st.selectbox(
            "选择用户",
            df_users['username'].tolist(),
            key="perm_user_select"
        )
        
        if selected_user:
            user_info = df_users[df_users['username'] == selected_user].iloc[0]
            
            st.markdown(f"**当前角色:** {user_info['role']}")
            st.markdown(f"**当前状态:** {user_info['status']}")
            
            # 修改角色
            new_role = st.selectbox(
                "修改角色",
                list(roles_permissions.keys()),
                index=list(roles_permissions.keys()).index(user_info['role']),
                key="new_role_select"
            )
            
            # 修改状态
            new_status = st.selectbox(
                "修改状态",
                ['活跃', '非活跃', '已禁用'],
                index=['活跃', '非活跃', '已禁用'].index(user_info['status']),
                key="new_status_select"
            )
            
            # 特殊权限
            st.markdown("**特殊权限:**")
            special_perms = {
                'API访问': st.checkbox("API访问权限", key="api_access"),
                '数据导出': st.checkbox("数据导出权限", key="data_export"),
                '批量操作': st.checkbox("批量操作权限", key="batch_ops"),
                '系统监控': st.checkbox("系统监控权限", key="system_monitor")
            }
            
            # 保存更改
            col_save1, col_save2 = st.columns(2)
            
            with col_save1:
                if st.button("💾 保存更改", key="save_permissions"):
                    st.success(f"✅ 已更新 {selected_user} 的权限设置")
            
            with col_save2:
                if st.button("🔄 重置权限", key="reset_permissions"):
                    st.info(f"🔄 已重置 {selected_user} 的权限为默认设置")
    
    # 权限统计
    st.markdown("#### 📊 权限使用统计")
    
    stats_col1, stats_col2, stats_col3 = st.columns(3)
    
    with stats_col1:
        st.markdown("**📈 角色分布统计**")
        role_stats = df_users['role'].value_counts()
        for role, count in role_stats.items():
            percentage = count / len(df_users) * 100
            st.markdown(f"- {role}: {count} 人 ({percentage:.1f}%)")
    
    with stats_col2:
        st.markdown("**🎯 状态分布统计**")
        status_stats = df_users['status'].value_counts()
        for status, count in status_stats.items():
            percentage = count / len(df_users) * 100
            st.markdown(f"- {status}: {count} 人 ({percentage:.1f}%)")
    
    with stats_col3:
        st.markdown("**⚡ 活跃度统计**")
        high_activity = len(df_users[df_users['message_count'] > 200])
        medium_activity = len(df_users[(df_users['message_count'] >= 50) & (df_users['message_count'] <= 200)])
        low_activity = len(df_users[df_users['message_count'] < 50])
        
        st.markdown(f"- 高活跃: {high_activity} 人")
        st.markdown(f"- 中活跃: {medium_activity} 人") 
        st.markdown(f"- 低活跃: {low_activity} 人")

if __name__ == "__main__":
    main()
